"""
面向对象，数据分析案例，主业务逻辑代码
实现步骤：
1、设计一个类，可以完成数据的封装
2、设计一个抽象类，定义文件读取的相关功能，并使用子类实现具体功能
3、读取文件，生产数据对象
4、进行数据需求的逻辑计算（计算每天的销售额）
5、通过pyecharts进行图形绘制
"""
from file_define import FileReader,TextFileReader,JsonFileReader
from data_define import Record

from pyecharts.charts import Bar
from pyecharts.options import TitleOpts,VisualMapOpts,LegendOpts,ToolboxOpts,InitOpts,LabelOpts
from pyecharts.globals import ThemeType

from pymysql import Connection

text_file = TextFileReader("E:/excel学习文档-表格/黑马-可视化案例数据/2011年1月销售数据.txt")
json_file = JsonFileReader("E:/excel学习文档-表格/黑马-可视化案例数据/2011年2月销售数据JSON.txt")

# 合并两个月的数据
jan_data : list[Record] = text_file.read_data()
feb_data : list[Record] = json_file.read_data()
all_data : list[Record] = jan_data + feb_data

print(all_data)

# 构建mysql链接对象
conn = Connection(
    host = 'localhost',
    port = 3306,
    user = 'root',
    password = 'xsc921101',
    autocommit = True
)

print(conn.get_server_info())

# 获取游标对象
cursor = conn.cursor()

#
# 选择数据库 ~ py_sql
conn.select_db("py_sql")

# 创建表 - orders
cursor.execute("create table orders(date date,id varchar(50),money int,province varchar(20))")

# # # 组织sql语句
for elemen in all_data:
    sql = f"insert into orders(date,id,money,province)" \
          f"values('{elemen.date}','{elemen.id}',{elemen.money},'{elemen.province}')"

# 执行sql语句
    cursor.execute(sql)

# 查询表数据
cursor.execute("select date,id,money,province from orders")

# 获取表数据
results = cursor.fetchall()
for r in results:
    print(r)

# 关闭mysql链接对象
conn.close()






# TODO 字典数据处理

dict_list = {}

for elemen in all_data:
    if elemen.date in dict_list.keys():
        dict_list[elemen.date] += elemen.money
    else:
        dict_list[elemen.date] = elemen.money

# print(dict_list)
# 方法一
# x_data = []
# y_data = []
#
# for date in dict_list.keys():
#     x_data.append(date)
#     y_data.append(dict_list[date])
# print(y_data)
# print(x_data)

# 方法二
x_data = list(dict_list.keys())
y_data = list(dict_list.values())
# print(y_data)
# print(x_data)

bar = Bar(init_opts = InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(x_data)
bar.add_yaxis("销售数据",y_data,label_opts=LabelOpts(is_show = False ))

bar.set_global_opts(
    title_opts = TitleOpts(title = "2011年1-2月销售数据柱状图",pos_left ="center",pos_bottom = "1%"),
    legend_opts = LegendOpts(is_show = True),
    toolbox_opts= ToolboxOpts(is_show = True),
    visualmap_opts = VisualMapOpts(is_show =True)
)

bar.render("2011年1-2月销售数据柱状图.html")